import store from '../store'
import token from './token'

// 白名单（不需要登录的页面路径）
const whiteList = ['/', '/pages/index/index', '/pages/login/login', '/pages/message/message', '/pages/mine/mine',
	'/pages/register/register', '/pages/login/phone-login','/pages/shop/index'
]

// 路由方法列表
const routerMethods = ["navigateTo", "redirectTo", "reLaunch", "switchTab"]

// 检查并获取用户信息
async function checkUserInfo() {
	// 如果 Vuex 已有用户信息，直接返回 true
	if (store.state.userName) return true

	// 尝试从后端获取用户信息
	try {
		const success = await store.dispatch('getUserInfo')
		return success
	} catch (error) {
		console.error('获取用户信息失败:', error)
		return false
	}
}

// 路由拦截处理函数
async function routerInterceptor(e) {
	const targetPath = e.url.split('?')[0]
	const isInWhiteList = whiteList.includes(targetPath)

	// 1. 如果有 token，检查用户信息
	if (token.getToken()) {
		const hasUserInfo = await checkUserInfo()
		if (hasUserInfo) {
			return {
				invoke: true
			} // 允许跳转
		} else {
			// token 无效，跳转登录
			uni.reLaunch({
				url: '/pages/login/login'
			})
			return {
				invoke: false
			}
		}
	}
	// 2. 没有 token，但访问白名单页面
	else if (isInWhiteList) {
		return {
			invoke: true
		}
	}
	// 3. 未登录访问非白名单页面
	else {
		uni.showToast({
			title: '请先登录',
			icon: 'none'
		})
		uni.navigateTo({
			url: '/pages/login/login'
		})
		return {
			invoke: false
		}
	}
}

// 初始化路由拦截器
export function setupRouterInterceptor() {
	routerMethods.forEach(method => {
		const originalMethod = uni[method]

		uni[method] = async function(options) {
			//console.log(`拦截 ${method} 跳转:`, options.url)

			// 处理特殊逻辑：switchTab不能带参数
			if (method === 'switchTab') {
				options.url = options.url.split('?')[0]
			}

			// 执行路由拦截检查
			const result = await routerInterceptor(options)

			if (result.invoke) {
				return originalMethod.call(uni, options)
			} else {
				return Promise.reject(new Error('路由跳转被拦截'))
			}
		}
	})
}

export default setupRouterInterceptor